package com.test;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
import org.apache.tomcat.util.http.fileupload.servlet.ServletRequestContext;

public class UploadServlet extends HttpServlet
{
	private static final long serialVersionUID = 1L;

	// 上传文件存储目录
	private static final String UPLOAD_DIRECTORY = "upload";

	// 上传配置
	private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB
	private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
	private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB

	protected void doGet( HttpServletRequest request, HttpServletResponse response )
					throws ServletException, IOException
	{
		response.setHeader("Content-Language", "es");
		if (! ServletFileUpload.isMultipartContent( request ) )
		{
			PrintWriter writer = response.getWriter();
			writer.println( "Error: 表单必须包含 enctype=multipart/form-data" );
			writer.flush();
			return;
		}

		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setSizeThreshold( MEMORY_THRESHOLD );
		factory.setRepository( new File( System.getProperty( "java.io.tmpdir" ) ) );
		ServletFileUpload upload = new ServletFileUpload( factory );
		// 设置最大文件上传值
		upload.setFileSizeMax( MAX_FILE_SIZE );
		// 设置最大请求值 (包含文件和表单数据)
		upload.setSizeMax( MAX_REQUEST_SIZE );// 中文处理
		upload.setHeaderEncoding( "UTF-8" );
		// 构造临时路径来存储上传的文件
		// 这个路径相对当前应用的目录
		String uploadPath = request.getServletContext().getRealPath( "./" )+ UPLOAD_DIRECTORY;
		// 如果目录不存在则创建
		File uploadDir = new File( uploadPath );
		if ( !uploadDir.exists() )
		{
			uploadDir.mkdir();
		}

		try
		{
			// 解析请求的内容提取文件数据
			List< FileItem > formItems = upload.parseRequest( new ServletRequestContext( request ) );
			if ( formItems != null && formItems.size() > 0 )
			{
				// 迭代表单数据
				for ( FileItem item : formItems )
				{
					// 处理不在表单中的字段
					if ( !item.isFormField() )
					{
						String fileName = new File( item.getName() ).getName();
						String filePath = uploadPath + File.separator + fileName;
						File storeFile = new File( filePath );
						// 在控制台输出文件的上传路径
						System.out.println( filePath );
						// 保存文件到硬盘
						item.write( storeFile );
						request.setAttribute( "message", "文件上传成功!" );
					}
				}
			}
		}
		catch ( Exception ex )
		{
			request.setAttribute( "message", "错误信息: " + ex.getMessage() );
		}
		// 跳转到 message.jsp
		request.getServletContext().getRequestDispatcher( "/upload_message.jsp" ).forward( request,response );
	}

	protected void doPost( HttpServletRequest request, HttpServletResponse response )
					throws ServletException, IOException
	{
		doGet( request, response );
	}

}
